# Copyright (C) 2020-2025 Jonathan Müller and lexy contributors
# SPDX-License-Identifier: BSL-1.0

include(FetchContent)

# Fetch benchmark data.
message(STATUS "Fetching json benchmark data")
function(fetch_data file url)
    if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/data/${file})
        file(DOWNLOAD "${url}" "${CMAKE_CURRENT_BINARY_DIR}/data/${file}" STATUS status)
        list(GET status 0 status_code)
        list(GET status 1 status_string)

        if(NOT status_code EQUAL 0)
            message(FATAL_ERROR "error downloading ${file}: ${status_string}")
        endif()
    endif()
endfunction()

fetch_data(canada.json https://github.com/miloyip/nativejson-benchmark/raw/master/data/canada.json)
fetch_data(citm_catalog.json https://github.com/miloyip/nativejson-benchmark/raw/master/data/citm_catalog.json)
fetch_data(twitter.json https://raw.githubusercontent.com/miloyip/nativejson-benchmark/master/data/twitter.json)

# Benchmarking executable.
add_executable(lexy_benchmark_json)
target_sources(lexy_benchmark_json PRIVATE main.cpp baseline.cpp lexy.cpp)
target_link_libraries(lexy_benchmark_json PRIVATE foonathan::lexy::dev foonathan::lexy::file foonathan::lexy::unicode nanobench)
target_compile_definitions(lexy_benchmark_json PRIVATE LEXY_BENCHMARK_DATA="${CMAKE_CURRENT_BINARY_DIR}/data/")
set_target_properties(lexy_benchmark_json PROPERTIES OUTPUT_NAME "json")

# Compare with PEGTL's json parser.
message(STATUS "Fetching PEGTL")
FetchContent_Declare(pegtl URL https://github.com/taocpp/PEGTL/archive/main.zip)
if(NOT pegtl_POPULATED)
    FetchContent_Populate(pegtl)
    add_subdirectory(${pegtl_SOURCE_DIR} ${pegtl_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()

target_sources(lexy_benchmark_json PRIVATE pegtl.cpp)
target_link_libraries(lexy_benchmark_json PRIVATE taocpp::pegtl)

# Compare with nlohmann/json.
message(STATUS "Fetching nlohmann/json")
FetchContent_Declare(nlohmann_json URL https://github.com/nlohmann/json/archive/develop.zip)
FetchContent_GetProperties(nlohmann_json)
if(NOT nlohmann_json_POPULATED)
    FetchContent_Populate(nlohmann_json)
endif()

target_sources(lexy_benchmark_json PRIVATE nlohmann.cpp)
target_include_directories(lexy_benchmark_json PRIVATE ${nlohmann_json_SOURCE_DIR}/include)

# Compare with rapidjson.
message(STATUS "Fetching rapidjson")
FetchContent_Declare(rapidjson URL https://github.com/Tencent/rapidjson/archive/master.zip)
FetchContent_GetProperties(rapidjson)
if(NOT rapidjson_POPULATED)
    FetchContent_Populate(rapidjson)
endif()

target_sources(lexy_benchmark_json PRIVATE rapidjson.cpp)
target_include_directories(lexy_benchmark_json PRIVATE ${rapidjson_SOURCE_DIR}/include)

# Compare with Boost.JSON.
find_package(Boost COMPONENTS json)
if (Boost_FOUND)
    target_sources(lexy_benchmark_json PRIVATE boost.cpp)
    target_link_libraries(lexy_benchmark_json PRIVATE Boost::json)
    target_compile_definitions(lexy_benchmark_json PRIVATE LEXY_HAS_BOOST_JSON)
endif()

# compare glaze
FetchContent_Declare(glaze URL https://github.com/stephenberry/glaze/archive/main.zip)
FetchContent_MakeAvailable(glaze)
target_sources(lexy_benchmark_json PRIVATE glaze.cpp)
target_link_libraries(lexy_benchmark_json PRIVATE glaze::glaze)
